commonlibsse_ng\re\e/
ExtraTextDisplayData.rs1use crate::re::BGSMessage::BGSMessage;
19use crate::re::BSExtraData::{BSExtraData, DerivedBSExtraData};
20use crate::re::BSFixedString::BSFixedString;
21use crate::re::ExtraDataType::ExtraDataType;
22use crate::re::TESBoundObject::TESBoundObject;
23use crate::re::TESQuest::TESQuest;
24use crate::re::offsets_rtti::RTTI_ExtraTextDisplayData;
25use crate::re::offsets_vtable::VTABLE_ExtraTextDisplayData;
26use crate::rel::id::VariantID;
27use core::ffi::{CStr, c_char, c_float};
28use std::ptr;
29
30#[repr(C)]
31#[derive(Debug, PartialEq)]
32pub struct ExtraTextDisplayData {
33 pub __base: BSExtraData,
35
36 pub display_name: BSFixedString,
39
40 pub display_name_text: *mut BGSMessage,
43
44 pub owner_quest: *mut TESQuest,
47
48 pub owner_instance: DisplayDataType,
51
52 pub temper_factor: f32,
55
56 pub custom_name_length: u16,
59
60 pub pad32: u16,
63
64 pub pad34: u32,
67}
68
69const _: () = {
70 assert!(core::mem::offset_of!(ExtraTextDisplayData, __base) == 0x0);
71 assert!(core::mem::offset_of!(ExtraTextDisplayData, display_name) == 0x10);
72 assert!(core::mem::offset_of!(ExtraTextDisplayData, display_name_text) == 0x18);
73 assert!(core::mem::offset_of!(ExtraTextDisplayData, owner_quest) == 0x20);
74 assert!(core::mem::offset_of!(ExtraTextDisplayData, owner_instance) == 0x28);
75 assert!(core::mem::offset_of!(ExtraTextDisplayData, temper_factor) == 0x2C);
76 assert!(core::mem::offset_of!(ExtraTextDisplayData, custom_name_length) == 0x30);
77 assert!(core::mem::offset_of!(ExtraTextDisplayData, pad32) == 0x32);
78 assert!(core::mem::offset_of!(ExtraTextDisplayData, pad34) == 0x34);
79 assert!(core::mem::size_of::<ExtraTextDisplayData>() == 0x38);
80};
81
82impl Default for ExtraTextDisplayData {
83 #[inline]
84 fn default() -> Self {
85 Self::new()
86 }
87}
88
89impl DerivedBSExtraData for ExtraTextDisplayData {
90 #[inline]
91 fn get_extra_data(&self) -> &BSExtraData {
92 &self.__base
93 }
94
95 #[inline]
96 fn get_extra_data_type() -> ExtraDataType {
97 Self::EXTRA_DATA_TYPE
98 }
99}
100
101impl ExtraTextDisplayData {
102 pub const RTTI: VariantID = RTTI_ExtraTextDisplayData;
104
105 pub const VTABLE: [VariantID; 1] = VTABLE_ExtraTextDisplayData;
107
108 pub const EXTRA_DATA_TYPE: ExtraDataType = ExtraDataType::TextDisplayData;
110
111 #[inline]
113 pub const fn new() -> Self {
114 Self {
115 __base: BSExtraData::new(),
116 display_name: BSFixedString::DEFAULT,
117 display_name_text: ptr::null_mut(),
118 owner_quest: ptr::null_mut(),
119 owner_instance: DisplayDataType::Uninitialized,
120 temper_factor: 1.0,
121 custom_name_length: 0,
122 pad32: 0,
123 pad34: 0,
124 }
125 }
126
127 #[inline]
129 pub fn from_name(name: &CStr) -> Self {
130 let mut instance = Self::new();
131 instance.set_name(name);
132 instance
133 }
134
135 #[inline]
139 pub unsafe fn from_form(form: *mut TESBoundObject, temper_factor: f32) -> Self {
140 let mut instance = Self::new();
141 unsafe { instance.get_display_name(form, temper_factor) };
142 instance
143 }
144
145 #[inline]
147 pub const fn get_type(&self) -> ExtraDataType {
148 ExtraDataType::TextDisplayData
149 }
150
151 #[commonlibsse_ng_derive_internal::relocate_fn(se_id = 12626, ae_id = 12768)]
155 pub unsafe fn get_display_name(
156 &mut self,
157 form: *const TESBoundObject, temper_factor: c_float,
159 ) -> *const c_char {
160 }
161
162 #[inline]
164 pub fn is_player_set(&self) -> bool {
165 self.owner_instance == DisplayDataType::CustomName
166 }
167
168 #[inline]
170 pub fn set_name(&mut self, name: &CStr) {
171 if !self.display_name_text.is_null() {
172 return;
173 }
174
175 self.display_name = BSFixedString::new(name);
176 self.custom_name_length = name.count_bytes() as u16;
177 self.owner_instance = DisplayDataType::CustomName;
178 self.temper_factor = 1.0;
179 }
180}
181
182bitflags::bitflags! {
183 #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
184 pub struct DisplayDataType: i32 {
185 const Uninitialized = -1;
186 const CustomName = -2;
187 }
188}
189
190#[repr(C)]
194#[derive(Debug)]
195pub struct ExtraTextDisplayDataVtbl {
196 pub CxxDrop: fn(this: &mut ExtraTextDisplayData),
198
199 pub GetType: fn(this: &ExtraTextDisplayData) -> ExtraDataType,
201}
202
203impl Default for ExtraTextDisplayDataVtbl {
204 #[inline]
205 fn default() -> Self {
206 Self::new()
207 }
208}
209
210impl ExtraTextDisplayDataVtbl {
211 pub const fn new() -> Self {
213 const fn CxxDrop(_this: &mut ExtraTextDisplayData) {}
214
215 const fn GetType(_this: &ExtraTextDisplayData) -> ExtraDataType {
216 ExtraTextDisplayData::EXTRA_DATA_TYPE
217 }
218
219 Self { CxxDrop, GetType }
220 }
221}